home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / arexx / ole1v10a.lha / OLE_System / modules / fw2 / AlignObjects.fw next >
Encoding:
Text File  |  1995-02-10  |  7.4 KB  |  408 lines

  1. /*
  2.  * AlignObjects.fw
  3.  *
  4.  * USAGE: AlignObjects.fw
  5.  *
  6.  * Add a powerfull function to FinalWriter
  7.  *
  8.  * HISTORY:
  9.  * v1.01    added "ICONIFY"
  10.  *
  11.  * v1.02    aligned with the new server design v1.10
  12.  *
  13.  * $(C): (1994, Rocco Coluccelli, Bologna)
  14.  * $VER: AlignObjects.fw 1.02 (30.Nov.1994)
  15.  */
  16.  
  17. OPTIONS RESULTS
  18.  
  19. PARSE ARG oleclip
  20. PARSE VALUE GETCLIP(oleclip) WITH jobID modID box.left box.top char.w char.h olewin oleport olehost . userport . locale config .
  21.  
  22. ADDRESS VALUE userport
  23. SetMeasure "MICROPOINTS"
  24.  
  25. ADDRESS VALUE oleport
  26.  
  27.     align. = 0
  28.     obj_lock = 0; lock. = GetLocale(1); lock.0 = GetLocale(2)
  29.  
  30.     /*
  31.      *    these remember the last kind of alignement for radio buttons
  32.      */
  33.     n.horz = 0; n.vert = 0
  34.  
  35. IF OPENPORT(olehost) == NULL() THEN DO
  36.     ERROR jobID modID 1 olehost
  37.     SETJOB jobID 'end'
  38.     EXIT 10
  39.     END
  40.  
  41. st = GUIGads()
  42. DO UNTIL st = 'end'
  43.  
  44.     CALL WAITPKT(olehost)
  45.     pkt = GETPKT(olehost)
  46.  
  47.     IF pkt == NULL() THEN ITERATE
  48.  
  49.     PARSE VALUE GETARG(pkt) WITH cmd argv
  50.     PARSE VALUE GETARG(pkt,1) WITH n0 .
  51.  
  52.     SELECT
  53.  
  54.         /*
  55.          *    align.horz = (1 left  2 center  3 right)
  56.          *    align.vert = (1 up    2 center  3 down)
  57.          */
  58.         WHEN cmd = 'ALIGN' THEN DO
  59.             PARSE VAR argv a1 a2 .
  60.  
  61.             IF n.a1 > 0 THEN DO
  62.                 n1 = n.a1; g_str.n1 = 0
  63.                 CALL Gadgets(2,n1)
  64.                 END
  65.  
  66.             IF n.a1 ~= n0 THEN DO
  67.                 g_str.n0 = ~g_str.n0
  68.                 CALL Gadgets(2,n0)
  69.                 END
  70.  
  71.             align.a1 = g_str.n0 * a2
  72.             n.a1 = g_str.n0 * n0
  73.         END
  74.  
  75.         WHEN cmd = 'START' & ~(align.vert = 0 & align.horz = 0) THEN DO
  76.             ADDRESS VALUE userport
  77.             CALL Gadgets(3,n0)
  78.  
  79.             IF SelectAllObj() THEN DO
  80.                 obj_lock = ExistsLockedObj()
  81.                 CALL CalcNewPos()
  82.                 CALL ReselectObj()
  83.                 CALL Gadgets(1,nundo)
  84.                 END
  85.  
  86.             CALL Gadgets(1,n0)
  87.             ADDRESS
  88.         END
  89.  
  90.         WHEN cmd = 'UNDO' THEN DO
  91.             ADDRESS VALUE userport
  92.  
  93.             CALL UndoAlignObj()
  94.             CALL ReselectObj()
  95.             CALL Gadgets(3,nundo)
  96.  
  97.             ADDRESS
  98.         END
  99.  
  100.         WHEN cmd = 'LOCK' THEN DO
  101.  
  102.             IF obj_lock = 0 THEN DO
  103.                 ADDRESS VALUE userport
  104.                 FirstObject 'SELECTED'
  105.                 obj_lock = result
  106.                 ADDRESS
  107.                 END
  108.  
  109.             ELSE obj_lock = 0
  110.  
  111.             g_str.nlock = lock.obj_lock
  112.             CALL Gadgets(2,nlock)
  113.         END
  114.  
  115.         WHEN cmd = 'UNICONIFY' THEN
  116.             CALL Gadgets(8,1,nundo)
  117.  
  118.         WHEN cmd = 'HELP' THEN
  119.             ABOUT jobID modID 'HELP' || st
  120.  
  121.         WHEN cmd = 'QUIT' THEN st = 'end'
  122.  
  123.         OTHERWISE NOP
  124.     END
  125.  
  126.     CALL REPLY(pkt,0)
  127.  
  128. END
  129.  
  130. CALL CLOSEPORT(olehost)
  131. EXIT 0
  132.  
  133.  
  134. ExistsLockedObj:
  135.  
  136.     DO n = 1 TO obj_n
  137.         IF obj_lock = obj_id.n THEN RETURN obj_lock
  138.     END
  139.  
  140.     g_str.nlock = lock.0
  141.     CALL Gadgets(2,nlock)
  142.  
  143. RETURN 0
  144.  
  145.  
  146. /*
  147.  *    build a list of all selected objects
  148.  */
  149. SelectAllObj:
  150.  
  151.     FirstObject 'SELECTED'
  152.     IF result = 0 THEN RETURN 0
  153.  
  154.     DO n = 1 UNTIL result = 0
  155.         obj_id.n = result
  156.         NextObject obj_id.n 'SELECTED'
  157.     END
  158.  
  159.     obj_n = n
  160.  
  161.     /*
  162.      *    read data from each object
  163.      */
  164.     DO n = 1 TO obj_n
  165.         GetObjectCoords obj_id.n
  166.         PARSE VAR result page obj_x.n obj_y.n obj_w.n obj_h.n .
  167.         new_x.n = obj_x.n; new_y.n = obj_y.n
  168.     END
  169.  
  170. RETURN 1
  171.  
  172.  
  173. UndoAlignObj:
  174.     DO n = 1 TO obj_n
  175.         SetObjectCoords obj_id.n page obj_x.n obj_y.n obj_w.n obj_h.n
  176.     END
  177.     Redraw
  178. RETURN
  179.  
  180.  
  181. ReselectObj:
  182.     DO n = 1 TO obj_n
  183.         SelectObject obj_id.n 'MULTIPLE'
  184.     END
  185. RETURN
  186.  
  187.  
  188. CalcNewPos:
  189.  
  190.     IF align.vert > 0  &  obj_lock = 0 THEN DO
  191.         up = obj_y.1
  192.         IF align.vert ~= 3 THEN
  193.             DO n = 2 TO obj_n
  194.                 up = MIN(up,obj_y.n)
  195.             END
  196.  
  197.         down = 0
  198.         IF align.vert ~= 1 THEN
  199.             DO n = 1 TO obj_n
  200.                 down = MAX(down,obj_y.n + obj_h.n)
  201.             END
  202.  
  203.         midvert = (up + down) % 2
  204.         END
  205.  
  206.     IF align.horz > 0  &  obj_lock = 0 THEN DO
  207.         left = obj_x.1
  208.         IF align.horz ~= 3 THEN
  209.             DO n = 2 TO obj_n
  210.                 left = MIN(left,obj_x.n)
  211.             END
  212.  
  213.         right = 0
  214.         IF align.horz ~= 1 THEN
  215.             DO n = 1 TO obj_n
  216.                 right = MAX(right,obj_x.n + obj_w.n)
  217.             END
  218.  
  219.         midhorz = (left + right) % 2
  220.         END
  221.  
  222.     /*
  223.      *    if only one object is selected...
  224.      */
  225.     IF obj_n = 1 THEN DO
  226.         GetPageSetup 'Width' 'Height' 'Top' 'Bottom' 'Left' 'Right'
  227.         PARSE VAR result width height up bottom left right .
  228.  
  229.         midvert = (up + height - bottom) % 2
  230.         down = height - bottom
  231.         midhorz = (left + width - right) % 2
  232.         right = width - right
  233.         END
  234.  
  235.     IF obj_lock > 0 THEN DO
  236.         GetObjectCoords obj_lock
  237.         PARSE VAR result page left up width height .
  238.  
  239.         midvert = up + height % 2
  240.         down = up + height
  241.         midhorz = left + width % 2
  242.         right = left + width
  243.         END
  244.  
  245.     IF align.vert = 1 THEN
  246.         DO n = 1 TO obj_n
  247.             new_y.n = up
  248.         END
  249.     ELSE IF align.vert = 2 THEN
  250.         DO n = 1 TO obj_n
  251.             new_y.n = midvert - (obj_h.n % 2)
  252.         END
  253.     ELSE IF align.vert = 3 THEN
  254.         DO n = 1 TO obj_n
  255.             new_y.n = down - obj_h.n
  256.         END
  257.  
  258.     IF align.horz = 1 THEN
  259.         DO n = 1 TO obj_n
  260.             new_x.n = left
  261.         END
  262.     ELSE IF align.horz = 2 THEN
  263.         DO n = 1 TO obj_n
  264.             new_x.n = midhorz - (obj_w.n % 2)
  265.         END
  266.     ELSE IF align.horz = 3 THEN
  267.         DO n = 1 TO obj_n
  268.             new_x.n = right - obj_w.n
  269.         END
  270.  
  271.     /*
  272.      *    write data for all selected objects
  273.      */
  274.     DO n = 1 TO obj_n
  275.         SetObjectCoords obj_id.n page new_x.n new_y.n obj_w.n obj_h.n
  276.     END
  277.     ReDraw
  278.  
  279. RETURN
  280.  
  281.  
  282. GetLocale: PROCEDURE EXPOSE locale
  283. ARG strID
  284.  
  285.     strID = 'þ'strID'þ'; PARSE VALUE GETCLIP(locale) WITH (strID)text'Þ'
  286.  
  287. RETURN text
  288.  
  289.  
  290. GUIGads:
  291.  
  292.     g_offx. = 2;    g_offx.1 = 0;            g_offx.3 = 2
  293.     g_offy. = 2;    g_offy.1 = char.h + 1;    g_offy.3 = 3
  294.     g_wid. = 8;                g_wid.1 = 0;            g_wid.3 = 12
  295.     g_hei. = char.h + 4;    g_hei.1 = char.h + 1;    g_hei.3 = char.h + 6
  296.     g_sx = char.w % 2;    g_sy = char.h % 4
  297.     g_onoff. = 0
  298.  
  299.     box.left = box.left + g_sx; box.top = box.top + 2 * g_sy
  300.     box.w = 24 * char.w
  301.  
  302.     n = 1; nmain = 1
  303.  
  304.     x = box.left; y = box.top
  305.     CALL IniGad(1,1,4,,GetLocale(3))
  306.     CALL IniGad(4,0,2,'ALIGN HORZ' 1 '%1' n,0)
  307.     CALL IniGad(4,0,1,'ALIGN HORZ' 2 '%1' n,0)
  308.     CALL IniGad(4,0,1,'ALIGN HORZ' 3 '%1' n,0)
  309.     y = y + g_hei.3 + 2 * g_sy
  310.     CALL IniGad(4,1,1,'ALIGN VERT' 1 '%1' n,0)
  311.     y = y + g_hei.3 + g_sy
  312.     CALL IniGad(4,1,1,'ALIGN VERT' 2 '%1' n,0)
  313.     CALL IniGad(1,0,2,,GetLocale(4))
  314.     y = y + g_hei.3 + g_sy
  315.     CALL IniGad(4,1,1,'ALIGN VERT' 3 '%1' n,0)
  316.  
  317.     y = y + g_hei.3 + 2 * g_sy
  318.     CALL IniGad(2,3,0,'HELP',GetLocale(5))
  319.     nlock = IniGad(2,1,0,'LOCK',lock.0)
  320.     CALL IniGad(2,0,0,'START %1' n,GetLocale(6))
  321.     nundo = IniGad(2,0,0,'UNDO',GetLocale(7))
  322.  
  323.     box.h = y + g_hei.2 + 2 * g_sy - box.top
  324.     WINDOW jobID modID (box.w + 2 * g_sx) (box.h + 2 * g_sy) 1 1
  325.     CALL Gadgets(4,1,nundo - 1)
  326.  
  327. RETURN nmain
  328.  
  329.  
  330. Gadgets:
  331.  
  332.     IF ARG(1) < 4 THEN
  333.         DO i = 2 TO ARG(); n = ARG(i)
  334.             IF ARG(1) ~= 1 THEN CALL DelGad(n,g_type.n)
  335.             IF ARG(1) ~= 3 THEN CALL NewGad(n,g_type.n)
  336.         END
  337.  
  338.     ELSE IF ARG(1) < 7 THEN
  339.         DO n = ARG(2) TO ARG(3)
  340.             IF ARG(1) ~= 4 THEN CALL DelGad(n,g_type.n)
  341.             IF ARG(1) ~= 6 THEN CALL NewGad(n,g_type.n)
  342.         END
  343.  
  344.     ELSE IF ARG(1) = 8 THEN
  345.         DO n = ARG(2) TO ARG(3)
  346.             IF g_onoff.n THEN CALL NewGad(n,g_type.n)
  347.         END
  348.  
  349.     ELSE DO
  350.         DO n = ARG(2) TO ARG(3)
  351.             g_onoff.n = 0
  352.             IF g_type.n ~= 1 THEN CALL RemoveGadget(olewin,GAD.n)
  353.         END
  354.         CALL SetAPen(olewin,0)
  355.         CALL RectFill(olewin,box.left,box.top,box.left + box.w,box.top + box.h)
  356.         CALL RefreshGadgets(olewin)
  357.         END
  358. RETURN
  359.  
  360.  
  361. DelGad:
  362. PARSE ARG n,t
  363.  
  364.     g_onoff.n = 0
  365.  
  366.     IF t ~= 1 THEN CALL RemoveGadget(olewin,GAD.n)
  367.  
  368.     x = g_xpos.n - g_offx.t; y = g_ypos.n - g_offy.t
  369.     CALL SetAPen(olewin,0)
  370.     CALL RectFill(olewin,x,y,x + g_len.n,y + g_hei.t)
  371.  
  372. RETURN
  373.  
  374.  
  375. NewGad:
  376. PARSE ARG n,t
  377.  
  378.     g_onoff.n = 1
  379.  
  380.     IF t = 2 THEN
  381.         CALL AddGadGet(olewin,g_xpos.n,g_ypos.n,GAD.n,g_str.n,g_msg.n)
  382.  
  383.     ELSE IF t = 4 THEN
  384.         CALL AddGadGet(olewin,g_xpos.n,g_ypos.n,GAD.n,D2C(32 + g_str.n * 183),g_msg.n)
  385.  
  386.     ELSE DO
  387.         CALL SetAPen(olewin,1)
  388.         CALL Move(olewin,g_xpos.n,g_ypos.n)
  389.         CALL Text(olewin,g_str.n)
  390.         END
  391. RETURN
  392.  
  393.  
  394. IniGad:
  395. PARSE ARG t,na,nx,g_msg.n,g_str.n
  396.  
  397.     x = x + nx * g_sx
  398.  
  399.     g_len.n = LENGTH(g_str.n) * char.w + g_wid.t
  400.  
  401.     IF na > 0 THEN x = box.left + (na - 1) * (box.w - g_len.n) % 2 + nx * g_sx
  402.  
  403.     g_xpos.n = x + g_offx.t; g_ypos.n = y + g_offy.t; g_type.n = t
  404.  
  405.     x = x + g_len.n; n = n + 1
  406.  
  407. RETURN n - 1
  408.